package com.cloud.sms.utils;

import java.text.SimpleDateFormat;
import java.util.Collections;
import java.util.Date;
import java.util.LinkedList;
import java.util.NoSuchElementException;

/**
 * 订单号生成工具
 * 
 * @author Administrator
 */
public class GenOrderNoUtils {

	private static GenOrderNoUtils instance = new GenOrderNoUtils();

	private GenOrderNoUtils() {
	}

	public static GenOrderNoUtils getInstance() {
		return instance;
	}

	private static Stack stack = new Stack();

	private static String current = "";
	
	/**
	 * 住宿订单号的第一位大写字母
	 */
	public final static String STAY = "H";

	/**
	 * 包车游订单号的第一位大写字母
	 */
	public final static String BAOCHE = "C";
	
	/**
	 * 精品线路订单号的第一位大写字母
	 */
	public final static String BOULINE = "P";
	
	/**
	 * 合并支付订单号的第一位大写字母
	 */
	public final static String MERGEPAY = "M";

	/**
	 * 按日期给出流水订单号后四位数
	 * 
	 * @param currentDate
	 * @return
	 */
	public synchronized Integer getDigits(String currentDate) {
		// 非当前日期则变换日期
		if (currentDate != null && !current.equals(currentDate)) {
			stack = new Stack();
			current = currentDate;
		}

		return stack.pop();
	}

	/**
	 * @describe 产生订单号
	 * 
	 * @auther ruanpeng
	 * @date 2014年7月18日
	 * @param first
	 *            第一位的大写字母
	 * @return
	 */
	public static String genetateOrderNo(String first) {
		Date now = new Date();
		String dateStr = new SimpleDateFormat("yyyy-MM-dd").format(now);
		Integer fourdigit = GenOrderNoUtils.getInstance().getDigits(dateStr);
		return first.toUpperCase() + new SimpleDateFormat("yyyyMMdd").format(now) + String.valueOf(fourdigit);
	}

	public static void main(String args[]) {
		System.out.println(GenOrderNoUtils.getInstance().getDigits("2014-02-11"));
	}
}

class Stack {

	LinkedList<Integer> list;

	public Stack() {
		list = new LinkedList<Integer>();
		for (int i = 0; i < 10000; i++) {
			list.add(i);
		}
		Collections.shuffle(list);
	}

	// 弹出元素
	public Integer pop() {
		try {
			Integer o = list.getFirst();
			list.removeFirst();
			return o;
		} catch (NoSuchElementException e) {
			// System.out.println(e);
			return null;
		}
	}

	// 压入元素
	public void push(Integer o) {
		list.addFirst(o);
	}

	// 得到栈顶元素
	public Integer getTop() {
		if (list.size() != 0) {
			return list.getFirst();
		} else {
			return null;
		}
	}

	public static void main(String[] args) {
		Stack MStack = new Stack();
		for (int i = 0; i < 10000; i++) {
			System.out.println(MStack.pop() + " ===");
		}
	}
}
